#ifndef _LOG_H_
#define _LOG_H_

#include <stdio.h>
#include <stdint.h>

// #define LOG_PRINTF(...) printf(__VA_ARGS__)
#define LOG_PRINTF(...)  fprintf(stdout , __VA_ARGS__) 

#define log_lock()      
#define log_unlock() 

enum { LOG_DEBUG = 0 , LOG_INFO , LOG_WARN , LOG_ERROR , LOG_FATAL , LOG_LEVEL_MAX } ;

extern uint8_t LogLevel ;

#define LOG_PRINTF_MSG(level , ...) \
{                                   \
    if(level >= LogLevel)           \
    {                               \
        log_lock() ;                \
        log_printf_head(level) ;    \
        LOG_PRINTF(__VA_ARGS__) ;   \
        LOG_PRINTF("\r\n") ;        \
        log_unlock() ;              \
    }                               \
}

#define LOG_D(...)  LOG_PRINTF_MSG(LOG_DEBUG , __VA_ARGS__)
#define LOG_I(...)  LOG_PRINTF_MSG(LOG_INFO  , __VA_ARGS__)
#define LOG_W(...)  LOG_PRINTF_MSG(LOG_WARN  , __VA_ARGS__)
#define LOG_E(...)  LOG_PRINTF_MSG(LOG_ERROR , __VA_ARGS__)
#define LOG_F(...)  LOG_PRINTF_MSG(LOG_FATAL , __VA_ARGS__)


void log_set_level(uint8_t level) ;
void log_printf_head(uint8_t level) ;

#endif //! LOG_H